#ifndef __FML_LED_COMPAT_H
#define __FML_LED_COMPAT_H

#ifdef __cplusplus
extern "C"
{
#endif

#define GD32
    //  #define STM32
    /***** 用户需实现此文件中的每个LED的端口的别称 ******/
    typedef enum
    {
        RUN_LED = 0,
        // LED1 = 1,
        // LED2 = 2,
        LED_TOTAL_NUM, // LED数量
    } LedTypedefEnum;  // LED枚举类型,数值应与LED_NUM一致
/* 时钟使能宏定义 */
#ifdef STM32
#include "stm32f4xx_hal.h" // 根据具体芯片系列调整
#define FML_LED_GPIO_CLK_ENABLE()     \
    do                                \
    {                                 \
        __HAL_RCC_GPIOA_CLK_ENABLE(); \
        __HAL_RCC_GPIOB_CLK_ENABLE(); \
        __HAL_RCC_GPIOC_CLK_ENABLE(); \
        __HAL_RCC_GPIOD_CLK_ENABLE(); \
        __HAL_RCC_GPIOE_CLK_ENABLE(); \
        __HAL_RCC_GPIOF_CLK_ENABLE(); \
        __HAL_RCC_GPIOG_CLK_ENABLE(); \
        __HAL_RCC_GPIOH_CLK_ENABLE(); \
        __HAL_RCC_GPIOI_CLK_ENABLE(); \
    } while (0)
#define FML_GPIO_MODE_OUTPUT_PP GPIO_MODE_OUTPUT_PP
#define FML_GPIO_NOPULL GPIO_NOPULL
#define FML_GPIO_SPEED_FREQ_HIGH GPIO_SPEED_FREQ_HIGH
#define FML_GPIO_PIN_RESET GPIO_PIN_RESET
#define FML_GPIO_PIN_SET GPIO_PIN_SET
/* GPIO操作函数映射 */
#define fml_led_gpio_init(port, pin)                      \
    do                                                    \
    {                                                     \
        GPIO_InitTypeDef GPIO_InitStruct = {0};           \
        GPIO_InitStruct.Pin = pin;                        \
        GPIO_InitStruct.Mode = FML_GPIO_MODE_OUTPUT_PP;   \
        GPIO_InitStruct.Pull = FML_GPIO_NOPULL;           \
        GPIO_InitStruct.Speed = FML_GPIO_SPEED_FREQ_HIGH; \
        HAL_GPIO_Init(port, &GPIO_InitStruct);            \
    } while (0)

#define fml_gpio_write_pin(port, pin, level) HAL_GPIO_WritePin(port, pin, level)
#define fml_gpio_read_pin(port, pin) HAL_GPIO_ReadPin(port, pin)
#define fml_gpio_toggle_pin(port, pin) HAL_GPIO_ReadPin(port, pin) ? fml_gpio_write_pin(port, pin, FML_GPIO_PIN_RESET) : fml_gpio_write_pin(port, pin, FML_GPIO_PIN_SET)
#endif
#ifdef GD32
#include "gd32f4xx.h" // 根据具体芯片系列调整
#define FML_LED_GPIO_CLK_ENABLE()           \
    do                                      \
    {                                       \
        rcu_periph_clock_enable(RCU_GPIOD); \
        rcu_periph_clock_enable(RCU_GPIOA); \
    } while (0)
#define FML_GPIO_PIN_RESET RESET
#define FML_GPIO_PIN_SET SET
/* GPIO操作函数映射 */
#define fml_led_gpio_init(port, pin)                                          \
    {                                                                         \
        gpio_mode_set(port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, pin);           \
        gpio_output_options_set(port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, pin); \
    }
    /* 配置为输出模式 浮空模式 ,配置为推挽输出 50MHZ*/

#define fml_gpio_write_pin(port, pin, level) gpio_bit_write(port, pin, level)
#define fml_gpio_read_pin(port, pin) gpio_input_bit_get(port, pin)
#define fml_gpio_toggle_pin(port, pin) gpio_bit_toggle(port, pin)
#endif

#ifdef __cplusplus
}
#endif

#endif /* __FML_LED_COMPAT_H */
